package com.softtown.modules.sys.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.softtown.common.constant.Constant;
import com.softtown.common.exception.ErrorCode;
import com.softtown.common.page.PageData;
import com.softtown.common.service.impl.BaseServiceImpl;
import com.softtown.common.utils.ConvertUtils;
import com.softtown.common.utils.Result;
import com.softtown.modules.sys.dao.CompSysRoleDao;
import com.softtown.modules.sys.dto.CompSysRoleDTO;
import com.softtown.modules.sys.entity.CompSysRoleDataScropeEntity;
import com.softtown.modules.sys.entity.CompSysRoleEntity;
import com.softtown.modules.sys.entity.CompSysRoleMenuEntity;
import com.softtown.modules.sys.entity.CompSysRoleUserEntity;
import com.softtown.modules.sys.enums.DataAccessAuthEnum;
import com.softtown.modules.sys.enums.StatusEnum;
import com.softtown.modules.sys.service.CompSysRoleDataScropeService;
import com.softtown.modules.sys.service.CompSysRoleMenuService;
import com.softtown.modules.sys.service.CompSysRoleService;
import com.softtown.modules.sys.service.CompSysRoleUserService;
import com.softtown.modules.sys.vo.CompSysRoleVO;
import javax.annotation.Resource;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @version v1.0
 * @ProjectName: softtown-aioffice
 * @ClassName: CompSysRoleServiceImpl
 * @Description: 公司-角色Service实现层
 * @Author: fuming
 * @Date: 2019/6/4 14:20
 */
@Service
public class CompSysRoleServiceImpl extends BaseServiceImpl<CompSysRoleDao, CompSysRoleEntity> implements CompSysRoleService {

    @Resource
    private CompSysRoleDataScropeService compSysRoleDataScropeService;

    @Resource
    private CompSysRoleMenuService compSysRoleMenuService;

    @Resource
    private CompSysRoleUserService compSysRoleUserService;

    /**
     * @param @param [companyId]
     * @return @return java.util.List<com.softtown.modules.sys.vo.CompSysRoleVO>
     * @throws
     * @Title: getListByCompId
     * @Description: 根据公司所属的ID来获取相应的所有角色Service实现方法
     * @author fuming
     * @date 2019/6/5 10:11
     */
    @Override
    public List<CompSysRoleVO> getListByCompId(Long companyId) {
        List<CompSysRoleEntity> roleListByCompId = baseDao.getListByCompId(companyId);
        return ConvertUtils.sourceToTarget(roleListByCompId, CompSysRoleVO.class);
    }

    /**
     * 激活禁用
     *
     * @param id
     * @return
     * @author Dingyayong
     * @date 2019/6/21 15:58
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result activate(Long id) {
        Result result = new Result<>();
        CompSysRoleEntity compSysRoleEntity = baseDao.getRoleById(id);
        if (compSysRoleEntity.getStatus().equals(StatusEnum.FORBIDDENSTATUS.value())) {
            compSysRoleEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
        } else {
            List<CompSysRoleUserEntity> compSysRoleUserEntities = compSysRoleUserService.getByRoleId(id);
            if(compSysRoleUserEntities.size()>0){
                return result.error(ErrorCode.FORBIDDEN_ROLE_ERROR);
            }
            compSysRoleEntity.setStatus(StatusEnum.FORBIDDENSTATUS.value());
        }
         updateById(compSysRoleEntity);
        return result;
    }

    @Override
    public PageData<CompSysRoleDTO> page(Map<String, Object> params) {
        IPage<CompSysRoleEntity> page = baseDao.selectPage(
                getPage(params, Constant.SORT, true),
                getWrapper(params)
        );
        return getPageData(page, CompSysRoleDTO.class);
    }


    private QueryWrapper<CompSysRoleEntity> getWrapper(Map<String, Object> params) {
        String compId = (String) params.get("compId");
        QueryWrapper<CompSysRoleEntity> wrapper = new QueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(compId), "comp_id", compId);
        wrapper.like("is_deleted","0");
        return wrapper;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteRole(Long id) {
        List<CompSysRoleMenuEntity> compSysRoleMenuEntity =compSysRoleMenuService.getByRoleId(id);
        for(CompSysRoleMenuEntity compSysRoleMenuEntity1 :compSysRoleMenuEntity){
            compSysRoleMenuEntity1.setIsDeleted(null);
            compSysRoleMenuService.updateRoleMenu(compSysRoleMenuEntity1);
        }
        List<CompSysRoleDataScropeEntity> compSysRoleDataScropeEntity =compSysRoleDataScropeService.getByRoleId(id);
        for (CompSysRoleDataScropeEntity compSysRoleDataScropeEntity1 :compSysRoleDataScropeEntity){
            compSysRoleDataScropeEntity1.setIsDeleted(null);
            compSysRoleDataScropeService.updateData(compSysRoleDataScropeEntity1);
        }
        CompSysRoleEntity compSysRoleEntity = baseDao.getRoleById(id);
        compSysRoleEntity.setIsDeleted(null);
        baseDao.updateRole(compSysRoleEntity);
    }

    @Override
    public CompSysRoleDTO get(Long id) {
        CompSysRoleEntity entity = baseDao.selectById(id);
        return ConvertUtils.sourceToTarget(entity, CompSysRoleDTO.class);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateRoleInfo(CompSysRoleDTO compSysRoleDTO) {
        CompSysRoleEntity compSysRoleEntity = baseDao.getRoleById(compSysRoleDTO.getId());
        compSysRoleEntity.setName(compSysRoleDTO.getName());
        compSysRoleEntity.setRemark(compSysRoleDTO.getRemark());
        compSysRoleEntity.setSort(compSysRoleDTO.getSort());
        compSysRoleEntity.setUpdateDate(new Date());
        compSysRoleEntity.setDataAccessAuth(compSysRoleDTO.getDataAccessAuth());
        compSysRoleEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
        compSysRoleEntity.setUpdater(compSysRoleDTO.getUserId());
        baseDao.updateRole(compSysRoleEntity);
        List<CompSysRoleDataScropeEntity> compSysRoleDataScropeEntities =compSysRoleDataScropeService.getDataEntityList(compSysRoleDTO.getCompId(), compSysRoleDTO.getId());
        if (compSysRoleDataScropeEntities.size()>0){
            for (CompSysRoleDataScropeEntity compSysRoleDataScropeEntity1 :compSysRoleDataScropeEntities){
                compSysRoleDataScropeEntity1.setIsDeleted(null);
                compSysRoleDataScropeEntity1.setUpdateDate(new Date());
                compSysRoleDataScropeEntity1.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                compSysRoleDataScropeService.updateData(compSysRoleDataScropeEntity1);
            }
        }
        if (compSysRoleDTO.getDataAccessAuth().equals(DataAccessAuthEnum.DataAccessAuthAUTODEPT.value())) {
            for (Long deptId : compSysRoleDTO.getDeptIdList()) {
                CompSysRoleDataScropeEntity compSysRoleDataScropeEntity =
                        compSysRoleDataScropeService.getDataEntity(compSysRoleDTO.getCompId(), compSysRoleDTO.getId(), deptId);
                if (compSysRoleDataScropeEntity != null) {
                    compSysRoleDataScropeEntity.setDeptId(deptId);
                    compSysRoleDataScropeService.updateData(compSysRoleDataScropeEntity);
                } else {
                    CompSysRoleDataScropeEntity compSysRoleDataScropeEntity1 = new CompSysRoleDataScropeEntity();
                    compSysRoleDataScropeEntity1.setDeptId(deptId);
                    compSysRoleDataScropeEntity1.setCompId(compSysRoleDTO.getCompId());
                    compSysRoleDataScropeEntity1.setRoleId(compSysRoleDTO.getId());
                    compSysRoleDataScropeService.insert(compSysRoleDataScropeEntity1);
                }
            }
        }
        List<CompSysRoleMenuEntity> compSysRoleMenuEntities = compSysRoleMenuService.getCompMenuByRole(compSysRoleDTO.getCompId(), compSysRoleDTO.getId());
        if(compSysRoleMenuEntities.size()>0){
            for (CompSysRoleMenuEntity compSysRoleMenuEntity : compSysRoleMenuEntities){
                compSysRoleMenuEntity.setIsDeleted(null);
                compSysRoleMenuEntity.setUpdateDate(new Date());
                compSysRoleMenuEntity.setUpdateTimestamp(String.valueOf(System.currentTimeMillis()));
                compSysRoleMenuService.updateRoleMenu(compSysRoleMenuEntity);
            }
        }
        for (Long menuId : compSysRoleDTO.getMenuIdList()) {
            CompSysRoleMenuEntity compSysRoleMenuEntity =
                    compSysRoleMenuService.getRoleMenu(compSysRoleDTO.getCompId(), compSysRoleDTO.getId(), menuId);
            if (compSysRoleMenuEntity != null) {
                compSysRoleMenuEntity.setMenuId(menuId);
                compSysRoleMenuService.updateRoleMenu(compSysRoleMenuEntity);
            } else {
                CompSysRoleMenuEntity compSysRoleMenuEntity1 = new CompSysRoleMenuEntity();
                compSysRoleMenuEntity1.setMenuId(menuId);
                compSysRoleMenuEntity1.setCompId(compSysRoleDTO.getCompId());
                compSysRoleMenuEntity1.setRoleId(compSysRoleDTO.getId());
                compSysRoleMenuService.insert(compSysRoleMenuEntity1);
            }
        }
    }

    @Override
    public CompSysRoleEntity getByCompIdAndRoleName(Long compId, String roleName) {
        return baseDao.getByCompIdAndRoleName(compId, roleName);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addRoleInfo(CompSysRoleDTO compSysRoleDTO) {
        CompSysRoleEntity compSysRoleEntity = new CompSysRoleEntity();
        compSysRoleEntity.setName(compSysRoleDTO.getName());
        compSysRoleEntity.setCompId(compSysRoleDTO.getCompId());
        compSysRoleEntity.setRemark(compSysRoleDTO.getRemark());
        compSysRoleEntity.setSort(compSysRoleDTO.getSort());
        compSysRoleEntity.setStatus(StatusEnum.ACTIVATESTATUS.value());
        compSysRoleEntity.setDataAccessAuth(compSysRoleDTO.getDataAccessAuth());
        baseDao.insert(compSysRoleEntity);
        CompSysRoleEntity compSysRoleEntity1 =baseDao.getByCompIdAndRoleName(compSysRoleDTO.getCompId(),compSysRoleDTO.getName());
        if(compSysRoleEntity1 !=null && compSysRoleDTO.getDataAccessAuth() !=null){
            if (compSysRoleDTO.getDataAccessAuth().equals(DataAccessAuthEnum.DataAccessAuthAUTODEPT.value())) {
                for (Long deptId : compSysRoleDTO.getDeptIdList()) {
                    CompSysRoleDataScropeEntity compSysRoleDataScropeEntity1 = new CompSysRoleDataScropeEntity();
                    compSysRoleDataScropeEntity1.setCompId(compSysRoleDTO.getCompId());
                    compSysRoleDataScropeEntity1.setRoleId(compSysRoleEntity1.getId());
                    compSysRoleDataScropeEntity1.setDeptId(deptId);
                    compSysRoleDataScropeService.insert(compSysRoleDataScropeEntity1);
                }
            }
        }
        for (Long menuId : compSysRoleDTO.getMenuIdList()) {
                CompSysRoleMenuEntity compSysRoleMenuEntity1 = new CompSysRoleMenuEntity();
                compSysRoleMenuEntity1.setCompId(compSysRoleDTO.getCompId());
            assert compSysRoleEntity1 != null;
            compSysRoleMenuEntity1.setRoleId(compSysRoleEntity1.getId());
                compSysRoleMenuEntity1.setMenuId(menuId);
                compSysRoleMenuService.insert(compSysRoleMenuEntity1);
        }
    }
}
